package edu.yngsxy.wkstudy.core.security;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.stp.StpInterface;
import edu.yngsxy.wkstudy.core.model.dto.SysRoleDTO;
import edu.yngsxy.wkstudy.core.sys.model.entity.SysPermission;
import edu.yngsxy.wkstudy.core.sys.service.SysRoleService;
import edu.yngsxy.wkstudy.core.util.WkRedisService;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 自定义权限加载接口实现类
 */
@Component    // 保证此类被 SpringBoot 扫描，完成 Sa-Token 的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 本 list 仅做模拟，实际项目中要根据具体业务逻辑来查询权限
       // if (loginId.equals("10002")) {
            List<String> list = new ArrayList<String>();
            list.add("user:get");
            list.add("codegen:gen");
            list.add("sysrole:*");//role模块下所有权限
            list.add("sysrolepermission:*");//role模块下所有权限
            list.add("sysuser:*");//role模块下所有权限
            list.add("sysuserrole:*");//role模块下所有权限
            list.add("ai:*");//role模块下所有权限
            list.add("syspermission:*");//role模块下所有权限
            return list;
       // }
       // return new ArrayList<String>();//其他账号无任何权限
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 本 list 仅做模拟，实际项目中要根据具体业务逻辑来查询角色
        if (loginId.equals("10002")) {
            List<String> list = new ArrayList<String>();
            list.add("admin");
            return list;
        }
        return new ArrayList<>();
    }

    /**
     * 刷新权限列表
     */
    public static void refreshRolePermissionList(SysRoleService sysRoleService, WkRedisService redisService) {
        //遍历角色及权限，清空缓存
        redisService.deleteKeysByPattern("wktoken:loginId-find-role:*");
        redisService.deleteKeysByPattern("wktoken:role-find-permission:*");
        List<SysRoleDTO> rolse = sysRoleService.selectAllWithPermissions();
        for (SysRoleDTO role : rolse) {
            List<String> perms = new ArrayList<>();//角色对应的权限列表（字符串权限码）
            for (SysPermission permission : role.getPermissions()) {//循环角色对应的权限列表
                Optional.ofNullable(permission.getCode()).ifPresent(perm_code -> perms.add(perm_code.toLowerCase()) );
            }
            //将角色码对应的权限列表也加入到缓存中
            SaManager.getSaTokenDao().setObject("wktoken:role-find-permission:" + role.getCode(), perms , 60 * 60 * 24 * 30);
        }
    }
}
